home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / m2 / cat3src / cat / catgloba.i < prev    next >
Text File  |  1997-10-26  |  25KB  |  840 lines

  1. IMPLEMENTATION MODULE CatGlobal;
  2.  
  3. FROM SYSTEM IMPORT ADDRESS, ADR, CODE, CALLSYS, CADR, LOC;
  4.  
  5. IMPORT FileNames, Strings, Storage;
  6.  
  7. IMPORT mtAppl;
  8. IMPORT MagicTypes;
  9. IMPORT MagicAES;
  10. IMPORT MagicCookie;
  11. IMPORT mtUtils;
  12. IMPORT MausTauschrsc;
  13. IMPORT CatTypes;
  14. IMPORT ConfVars;
  15. IMPORT Varnames;
  16. IMPORT Mintbind;
  17. IMPORT FileSys;
  18. FROM Void IMPORT v;
  19.  
  20. FROM GrafBase   IMPORT Rectangle;
  21.  
  22. IMPORT MagicStrings, mtDir, MagicDOS, mtCommand, MagicSys;
  23.  
  24. CONST
  25.     (* Cookies definieren *)
  26.     FselCookie  = 'FSEL';
  27.     MagiXCookie = 'MagX';
  28.     MultiGEMCookie = 'MGEM';
  29.     MagicMacCookie = 'MgMc';
  30.  
  31.  
  32. VAR update : BOOLEAN;
  33.     applPath  : CatTypes.pathStrType;
  34.     applName  : CatTypes.nameStrType;
  35.     apName    : ARRAY [0..39] OF CHAR;
  36.  
  37. PROCEDURE UpdateWindow(doUpdate : BOOLEAN);
  38. (* Sorgt fr die Update-Window Aufrufe. Es ist immer nur garantiert ein 
  39.  * WindUpdate aktiv, keine geschachtelten mehr!
  40.  *)
  41. BEGIN
  42.   IF doUpdate # update
  43.   THEN
  44.     IF doUpdate 
  45.     THEN
  46.       MagicAES.WindUpdate (MagicAES.BEGUPDATE)
  47.     ELSE
  48.       MagicAES.WindUpdate (MagicAES.ENDUPDATE);
  49.     END;
  50.     update := doUpdate
  51.   END;
  52. END UpdateWindow;
  53.  
  54. PROCEDURE SetColors();
  55. (* Setzt die Farbvariablen auf die in den Configvariablen
  56.  * eingestellten Werte
  57.  *)
  58. BEGIN
  59.   (* Anzeige *)
  60.   ConfVars.GetConfDefInt (cGrinTextCol, viewTextCol, 1);
  61.   ConfVars.GetConfDefInt (cGrinQuoteCol, viewQuoteCol, 1);
  62.   ConfVars.GetConfDefInt (cGrinQuoteEff, viewQuoteEff, 1);
  63.   ConfVars.GetConfDefInt (cGrinBackCol, viewBackCol, 0);
  64.   (* Editor *)
  65.   ConfVars.GetConfDefInt (cEditTextCol, editTextCol, 1);
  66.   ConfVars.GetConfDefInt (cEditBackCol, editBackCol, 0);
  67.   (* Stichwortliste *)
  68.   ConfVars.GetConfDefInt (cListTextCol, listTextCol, 1);
  69.   ConfVars.GetConfDefInt (cListQuoteCol, listUnreadCol, 1);
  70.   ConfVars.GetConfDefInt (cListBackCol, listBackCol, 0);
  71.   ConfVars.GetConfDefInt (cListOwnCol, listOwnCol, 1);
  72.   ConfVars.GetConfDefInt (cListQuoteEff, listUnreadEff, 1);
  73.   ConfVars.GetConfDefInt (cListOwnEff, listOwnEff, 1);
  74.   (* Nachrichtenauswahl *)
  75.   ConfVars.GetConfDefInt (cMsgTextCol, msgTextCol, 1);
  76.   ConfVars.GetConfDefInt (cMsgBackCol, msgBackCol, 0);
  77.   ConfVars.GetConfDefInt (cMsgHoldCol, msgHoldCol, 1);
  78.   ConfVars.GetConfDefInt (cMsgHoldEff, msgHoldEff, 1);
  79.   (* B„ume *)
  80.   ConfVars.GetConfDefInt (cTreeTextCol, treeTextCol, 1);
  81.   ConfVars.GetConfDefInt (cTreeBackCol, treeBackCol, 0);
  82.   ConfVars.GetConfDefInt (cTreeSubjectCol, treeLineCol, 1);
  83.   ConfVars.GetConfDefInt (cTreeUnreadCol, treeUnreadCol, 1);
  84.   ConfVars.GetConfDefInt (cTreeUnreadEff, treeUnreadEff, 1);
  85.   (* Naja, keine Farbe ;-) *)
  86.   ConfVars.GetConfDefStr (cOwnName, userName, "");
  87. END SetColors;
  88.  
  89. PROCEDURE FselGet(VAR InPath, InSel: ARRAY OF CHAR; REF ext, msg : ARRAY OF CHAR;
  90.                   pathOnly : BOOLEAN):BOOLEAN;
  91. (* Ausgelagert aus CAT.M, da ich die auch im Editor verwenden kann.
  92.  *)
  93. TYPE    fselPtr = POINTER TO RECORD
  94.                     id      : LONGCARD;
  95.                     version : CARDINAL;
  96.                   END;
  97.  
  98. VAR scrapP : CatTypes.pathStrType;
  99.     scrapN : CatTypes.nameStrType;
  100.     l      : CARDINAL;
  101.     fsel   : fselPtr;
  102.     noMCtrl: BOOLEAN;
  103. BEGIN
  104.   mtDir.DelTail (InPath);
  105.   MagicStrings.Assign(InPath, scrapP);
  106.   (*
  107.   l := LENGTH (InPath);
  108.   IF l > 0
  109.   THEN
  110.     IF InPath[l-1] #'\'
  111.     THEN InPath[l-1] := '\';InPath[l] := 0C;
  112.     END;
  113.   END;
  114.   *)
  115.   noMCtrl := MagicCookie.FindCookie (FselCookie, fsel);
  116.   IF noMCtrl
  117.   THEN
  118.     noMCtrl := fsel^.version >= 0200H;
  119.   END;
  120.   MagicStrings.Assign(InSel, scrapN);
  121.   MagicStrings.Append(ext, InPath);
  122.   IF ~noMCtrl
  123.   THEN
  124.     MagicAES.WindUpdate(MagicAES.BEGMCTRL);
  125.   END;
  126.   IF mtDir.GetDir(InPath, InSel, msg) THEN
  127.     IF ~noMCtrl
  128.     THEN
  129.       MagicAES.WindUpdate(MagicAES.ENDMCTRL);
  130.     END;
  131.     mtDir.DelTail(InPath);
  132.     IF pathOnly
  133.     THEN 
  134.       RETURN TRUE
  135.     ELSE
  136.       IF LENGTH (InSel) = 0
  137.       THEN
  138.         MagicStrings.Assign(scrapP, InPath);
  139.         MagicStrings.Assign(scrapN, InSel);
  140.         RETURN FALSE;
  141.       END;
  142.       RETURN TRUE;
  143.     END;
  144.   ELSE
  145.     IF ~noMCtrl
  146.     THEN
  147.       MagicAES.WindUpdate(MagicAES.ENDMCTRL);
  148.     END;
  149.     MagicStrings.Assign(scrapP, InPath);
  150.     MagicStrings.Assign(scrapN, InSel);
  151.     RETURN FALSE
  152.   END
  153. END FselGet;
  154.  
  155. PROCEDURE WithShift (kstate : BITSET) : BOOLEAN;
  156. (* Gibt zurck, ob eine der Shifttasten gedrckt wurde *)
  157. BEGIN
  158.   RETURN (MagicAES.KLSHIFT IN kstate) OR (MagicAES.KRSHIFT IN kstate)
  159. END WithShift;
  160.  
  161. PROCEDURE WithCtrl (kstate : BITSET) : BOOLEAN;
  162. (* Gibt zurck, ob Ctrl gedrckt wurde *)
  163. BEGIN
  164.   RETURN (MagicAES.KCTRL IN kstate)
  165. END WithCtrl;
  166.  
  167. PROCEDURE WithAlt (kstate : BITSET) : BOOLEAN;
  168. (* Gibt zurck, ob Alternate gedrckt wurde *)
  169. BEGIN
  170.   RETURN (MagicAES.KALT IN kstate)
  171. END WithAlt;
  172.  
  173. (*$L-,S-,R-*)
  174. PROCEDURE mouseData1;
  175. BEGIN
  176.   CODE (7,7,1,0,1,
  177.     (* mask data *)
  178.     960,4080,8184,16380,32766,32766,65535,65535,
  179.     65535,65535,32766,32766,16380,8184,4080,960,
  180.     (* mouse data *)
  181.     0,960,3888,7944,16132,16132,32514,32514,
  182.     16638,16638,8444,8444,4344,3312,960,0
  183.   );
  184. END mouseData1;
  185.  
  186. PROCEDURE mouseData2;
  187. BEGIN
  188.   CODE (
  189.     7,7,
  190.     1,0,1,
  191.     (* mask data *)
  192.     960,4080,8184,16380,32766,32766,65535,65535,
  193.     65535,65535,32766,32766,16380,8184,4080,960,
  194.     (* mouse data *)
  195.     0,960,4080,8184,12276,10212,17346,16770,
  196.     16770,17346,10212,12276,8184,4080,960,0
  197.   );
  198. END mouseData2;
  199.  
  200. PROCEDURE mouseData3;
  201. BEGIN
  202.   CODE (
  203.     7,7,
  204.     1,0,1,
  205.     (* mask data *)
  206.     960,4080,8184,16380,32766,32766,65535,65535,
  207.     65535,65535,32766,32766,16380,8184,4080,960,
  208.     (* mouse data *)
  209.     0,960,3312,4344,8444,8444,16638,16638,
  210.     32514,32514,16132,16132,7944,3888,960,0
  211.   );
  212. END mouseData3;
  213.  
  214. PROCEDURE mouseData4;
  215. BEGIN
  216.   CODE (
  217.     7,7,
  218.     1,0,1,
  219.     (* mask data *)
  220.     960,4080,8184,16380,32766,32766,65535,65535,
  221.     65535,65535,32766,32766,16380,8184,4080,960,
  222.     (* mouse data *)
  223.     0,960,3120,4104,14364,15420,32382,32766,
  224.     32766,32382,15420,14364,4104,3120,960,0
  225.   );
  226. END mouseData4;
  227. (*$L=,R=*)
  228.  
  229. CONST   mouseForms      = 4;
  230.  
  231. VAR mouseArray  : ARRAY [0..mouseForms] OF POINTER TO MagicTypes.MFORM;
  232.     mf          : MagicTypes.MFORM;
  233.     mouseIndex  : CARDINAL;
  234.  
  235. PROCEDURE busyMouse();
  236. BEGIN
  237.  mf := mouseArray[mouseIndex]^;
  238.  mtAppl.UserMouse (mf);
  239.  mtAppl.MouseUser;
  240.  mouseIndex := (mouseIndex + 1) MOD mouseForms;
  241. END busyMouse;
  242.  
  243. PROCEDURE FullScreenRedraw();
  244. (* Nur fr nicht-MultiTOS geeignet *)
  245. VAR rec : RECORD x,y,w,h : INTEGER END;
  246. BEGIN
  247.   WITH rec DO
  248.     x := 0; y := 0; w := mtAppl.MaxWidth; h := mtAppl.MaxHeight;
  249.   END;
  250.   MagicAES.FormDial(MagicAES.FMDFINISH, rec, rec);
  251.   v.int := MagicAES.MenuBar(MausTauschrsc.TreeAddr^[MausTauschrsc.menu], MagicAES.Set);
  252. END FullScreenRedraw;
  253.  
  254. PROCEDURE ConvertTabs (REF source : ARRAY OF CHAR; VAR dest : ARRAY OF CHAR; tabSize : CARDINAL);
  255.   CONST TAB = 11C;
  256.   VAR i, j, k, high : CARDINAL;
  257. BEGIN
  258.   IF HIGH (source) < HIGH (dest)
  259.   THEN
  260.     high := HIGH (source)
  261.   ELSE
  262.     high := HIGH(dest);
  263.   END;
  264.   i := 0;
  265.   j := 0;
  266.   WHILE (source[i] # 0C) & (i < high) & (j < high) DO
  267.     IF source[i] = TAB
  268.     THEN
  269.       FOR k := j TO (((j DIV tabSize)+1)*tabSize)-1 DO
  270.         dest[k] := ' ';
  271.       END;
  272.       j := ((j DIV tabSize) + 1) * tabSize;
  273.     ELSE
  274.       dest[j] := source[i];
  275.       INC(j);
  276.     END;
  277.     INC(i);
  278.   END;
  279.   dest[j] := 0C;
  280. END ConvertTabs;
  281.  
  282. PROCEDURE ReplaceStr (VAR str : ARRAY OF CHAR; REF s1, s2 : ARRAY OF CHAR);
  283.   VAR p : CARDINAL;
  284.       sLen : CARDINAL;
  285.       s1Len: CARDINAL; 
  286. BEGIN
  287.   sLen := LENGTH (str);
  288.   s1Len:= LENGTH (s1);
  289.   p := MagicStrings.Pos (s1, str, 0, FALSE);
  290.   WHILE p <= sLen DO
  291.     MagicStrings.Delete (str, p, s1Len);
  292.     MagicStrings.Insert (s2, str, p);
  293.     sLen := LENGTH (str);
  294.     p := MagicStrings.Pos (s1, str, p, FALSE);
  295.   END;
  296. END ReplaceStr;
  297.   
  298. PROCEDURE MakeStr(VAR source, dest : ARRAY OF CHAR);
  299. VAR z, l : CARDINAL;
  300.     cut  : ARRAY[0..5] OF CHAR;
  301.     ap   : ARRAY[0..1] OF CHAR;
  302. BEGIN
  303.   l := MagicStrings.Length(dest);
  304.   MagicStrings.Copy(dest, l-3, 3, cut);
  305.   MagicStrings.Assign ('  ',dest);
  306.   MagicStrings.Append(source, dest);
  307.   z := MagicStrings.Length(dest);
  308.   MagicStrings.Assign (' ', ap);
  309.   WHILE z <= l-4 DO
  310.     MagicStrings.Append(ap, dest);
  311.     INC(z)
  312.   END;
  313.   MagicStrings.Append(cut, dest);
  314. END MakeStr;
  315.  
  316.         (* Save Funktion *)
  317. PROCEDURE CreateBackup (REF fname : ARRAY OF CHAR): BOOLEAN;
  318.   VAR newName, path, name : ARRAY [0..139] OF CHAR;
  319.       ext       : ARRAY[0..7] OF CHAR;
  320.       res       : INTEGER;
  321.       oldDTA    : MagicDOS.PtrDTA;
  322.       myDTA     : MagicDOS.DTA;
  323.       dHandle   : LONGINT;
  324. BEGIN
  325.   FileNames.SplitPath (fname, path, name);
  326.   FileNames.SplitName (name, name, ext);
  327.   IF MagicStrings.Equal (ext,'BAK')
  328.   THEN
  329.     MagicStrings.Assign ('BAZ',ext);
  330.   ELSE
  331.     MagicStrings.Assign ('BAK',ext);
  332.   END;
  333.   (* neuen Namen zusammensetzen *)
  334.   FileNames.ConcatName (name, ext, name);
  335.   FileNames.ConcatPath (path, name, newName);
  336.   IF ~isMintDomain
  337.   THEN
  338.     (* Feststellen, ob Datei schon existiert *)
  339.     oldDTA := MagicDOS.Fgetdta ();
  340.     MagicDOS.Fsetdta (ADR(myDTA));
  341.     res := MagicDOS.Fsfirst (newName, {0,1,2,4,5});
  342.     MagicDOS.Fsetdta (oldDTA);
  343.     IF res = 0
  344.     THEN
  345.       (* Wenn Directory, dann Abbruch *)
  346.       IF myDTA.dAttrib = $10
  347.       THEN
  348.         RETURN FALSE
  349.       END;
  350.       (* kein Directory, also alte Datei l”schen *)
  351.       IF ~MagicDOS.Fdelete (newName) THEN RETURN FALSE END;
  352.     END;
  353.   ELSE
  354.     (* Feststellen, ob Datei schon existiert *)
  355.     res := MagicDOS.Fopen (newName, MagicDOS.Read);
  356.     IF res >= 0
  357.     THEN
  358.       (* Datei existiert *)
  359.       v.int := MagicDOS.Fclose (res);
  360.       (* kein Directory, also alte Datei l”schen *)
  361.       IF ~MagicDOS.Fdelete (newName) THEN RETURN FALSE END;
  362.     ELSE
  363.       (* Kann nicht ge”ffnet werden, m”glicherweise Directory? *)
  364.       dHandle := Mintbind.Dopendir (newName, 0);
  365.       IF dHandle >= 0
  366.       THEN
  367.         (* ist Directory, abbrechen *)
  368.         v.lint := Mintbind.Dclosedir (dHandle);
  369.         RETURN FALSE;
  370.       END;
  371.     END;
  372.   END;
  373.   res := MagicDOS.Frename (fname, newName);
  374.   RETURN res = 0;
  375. END CreateBackup;
  376.  
  377. (*-----------------------------------------------------------------------
  378.  *
  379.  * Pathfree ersetzt MagicDOS.Dfree
  380.  *
  381.  * Durch PathFree wird kontrolliert, wieviel Speicherplatz in einem
  382.  * bestimmten Pfad frei ist. Dabei werden gelinkte Pfade korrekt
  383.  * aufgel”st.
  384.  *
  385.  *-----------------------------------------------------------------------*)
  386. PROCEDURE PathFree(VAR dib : ARRAY OF LOC; VAR Path : ARRAY OF CHAR);
  387.  
  388.   PROCEDURE GetDrv(VAR Path : ARRAY OF CHAR) : CHAR;
  389.   TYPE
  390.     tpStr = POINTER TO ARRAY[0..511] OF CHAR;
  391.   
  392.   VAR
  393.     count : CARDINAL;
  394.     pPath, pLink : tpStr;
  395.     drv   : CHAR;
  396.   
  397.   BEGIN
  398.     count := LENGTH(Path);
  399.  
  400.     WHILE count > 0 DO
  401.       Storage.ALLOCATE(pPath, count+1);
  402.       Storage.ALLOCATE(pLink, 512);
  403.       MagicStrings.Copy(Path, 0, count, pPath^);
  404.       IF Mintbind.Freadlink(pLink^, pPath^) >= 0
  405.       THEN
  406.         (* dies ist ein Link, dessen Pfad wird weiter verfolgt
  407.          *)
  408.         drv := GetDrv(pLink^);
  409.         Storage.DEALLOCATE(pPath, 0);
  410.         Storage.DEALLOCATE(pLink, 0);
  411.         RETURN drv;
  412.       END;
  413.  
  414.       Storage.DEALLOCATE(pPath, 0);
  415.       Storage.DEALLOCATE(pLink, 0);
  416.  
  417.       (* n„chstes Pfadelement abtrennen *)
  418.       REPEAT
  419.         DEC(count);
  420.       UNTIL (count = 0) OR (Path[count] = '\');
  421.     END;
  422.  
  423.     RETURN CAP(Path[0]);
  424.  
  425.   END GetDrv;
  426.  
  427.  
  428. BEGIN
  429.   MagicDOS.Dfree(dib, ORD(GetDrv(Path)) - ORD('A') + 1);
  430. END PathFree;
  431.  
  432.  
  433. (*$L-,R-,S-*)
  434. PROCEDURE Bong1();
  435. BEGIN
  436.   CODE (
  437.     $0810,     (* VolA := $10 *)
  438.     $0918,     (* VolB := $18 *)
  439.     $0a00,     (* VolC := $00 *)
  440.     $0b00,     (* EnvPer := $2000 *)
  441.     $0c20,
  442.     $0d09,     (* EnvForm *)
  443.     $07f8,
  444.     $0088,     (* PerA := $0e8 *)
  445.     $0100,
  446.     $0220,     (* PerB := $220 *)
  447.     $0302,
  448.     $8228,       (* 0.8 second delay *)
  449.     $0800,     (* VolA := 0 *)
  450.     $0900,     (* VolB := 0 *)
  451.     $8200 ) ;
  452. END Bong1;
  453.  
  454. (* Die nachfolgenden Kl„nge sind genauso aufgebaut: *)
  455. PROCEDURE Bong2();
  456. BEGIN
  457.   CODE (
  458.     $0810, $0918, $0a00, $0b00, $0c20, $0d09,
  459.     $07f8, $00e8, $0101, $0220, $0302, $8228,
  460.     $0800, $0900, $8200 ) ;
  461. END Bong2;
  462.  
  463. PROCEDURE Bong3();
  464. BEGIN
  465.   CODE (
  466.     $0810, $0918, $0a00, $0b00, $0c20, $0d09,
  467.     $07f8, $00e8, $0103, $0220, $0301, $8228,
  468.     $0800, $0900, $8200 ) ;
  469. END Bong3;
  470.  
  471. PROCEDURE Bong4();
  472. BEGIN
  473.   CODE (
  474.     $0810, $0918, $0a00, $0b00, $0c20, $0d09,
  475.     $07f8, $0068, $0100, $02f0, $0300, $8228,
  476.     $0800, $0900, $8200 ) ;
  477. END Bong4;
  478.  
  479. PROCEDURE Bong5();
  480. BEGIN
  481.   CODE (
  482.     $0810, $0918, $0a00, $0b00, $0c20, $0d09,
  483.     $07f8, $0028, $0100, $0280, $0300, $8228,
  484.     $0800, $0900, $8200 ) ;
  485. END Bong5;
  486.  
  487. PROCEDURE Bong6();
  488. BEGIN
  489.   CODE (
  490.     $0810, $0918, $0a00, $0b00, $0c20, $0d09,
  491.     $07f8, $0028, $0104, $0280, $0306, $8228,
  492.     $0800, $0900, $8200 ) ;
  493. END Bong6;
  494.  
  495. PROCEDURE Bong7();
  496. BEGIN
  497.   CODE ($0101,$005e,$80f0,$07fe,$ff00)
  498. END Bong7;
  499.  
  500. PROCEDURE Bong72();
  501. BEGIN
  502.   CODE ($0101,$005E,$081F,$0300,$0200,$0900,$0500,$0400,
  503.         $0A00,$0600,$07FE,$0D01,$0C3C,$0BAF,$FF00)
  504. END Bong72;
  505. (*$L=,R=*)
  506.  
  507. CONST maxBing = 7;
  508.  
  509. VAR bongArray : ARRAY [1..maxBing] OF ADDRESS;
  510.  
  511. PROCEDURE Bing(which : INTEGER);
  512. BEGIN
  513.   IF (which <= 0) OR (which > maxBing) OR (magicMac)
  514.   THEN
  515.     MagicDOS.Cconout (7C);
  516.   ELSE
  517.     (* Dosound von der MagicLib will ein ARRAY OF LOC, deshalb so *)
  518.     CALLSYS (14, 32, bongArray[which]); 
  519.     IF which = 7 THEN 
  520.       CALLSYS (14, 32, ADDRESS(Bong72));
  521.     END;
  522.   END
  523. END Bing;
  524.  
  525. PROCEDURE SetStrings (tree: ADDRESS; from, to : INTEGER; REF string : ARRAY OF CHAR);
  526.   VAR i         : INTEGER;
  527.       entryLen  : INTEGER;
  528.       obIdx     : INTEGER;
  529.       str       : ARRAY [0..79] OF CHAR;
  530. BEGIN
  531.   (* Alle Textfelder l”schen *)
  532.   FOR i := from TO to DO
  533.     mtUtils.SetObjcString (tree, i, '');
  534.   END;
  535.   i := 0;
  536.   obIdx := from;
  537.   WHILE (i < INTEGER(LENGTH (string))) & (obIdx <= to) DO
  538.     mtUtils.ObjcStrLen (tree, obIdx, entryLen, v.int);
  539.     DEC (entryLen, 4);
  540.     MagicStrings.Copy (string, i, entryLen-1, str);
  541.     mtUtils.SetObjcString (tree, obIdx, str);
  542.     INC (obIdx);
  543.     INC (i, entryLen-1);
  544.   END;
  545. END SetStrings;
  546.  
  547. PROCEDURE GetStrings (tree: ADDRESS; from, to: INTEGER; VAR string : ARRAY OF CHAR); 
  548.   VAR i : INTEGER;
  549.       str : ARRAY [0..79] OF CHAR;
  550. BEGIN
  551.   string[0] := '';
  552.   FOR i := from TO to DO
  553.     mtUtils.ObjcString (tree, i, str);
  554.     MagicStrings.Append (str, string);
  555.   END;
  556. END GetStrings;
  557.  
  558. PROCEDURE SetAppl (REF str: ARRAY OF CHAR);
  559. (* Setzt den Namen der Applikation fr interne Zwecke
  560.  * Der Name muž ohne Extension angegeben werden.
  561.  *)
  562. BEGIN
  563.   MagicStrings.Assign (str, apName);
  564.   IF apName[LENGTH(apName)-1] # '.'
  565.   THEN
  566.     MagicStrings.Append ('.', apName);
  567.   END;
  568. END SetAppl;
  569.  
  570. PROCEDURE GetApplPath (VAR path: ARRAY OF CHAR);
  571. (* liefert den Pfad der Applikation, initialisiert dabei die interne
  572.  * Variable. Vorher muž einmal SetAppl aufgerufen werden
  573.  *)
  574. VAR p: ARRAY [0..255] OF CHAR;
  575.     d: CARDINAL;
  576.     drv  : CARDINAL;
  577.     dummy: MagicSys.lBITSET;
  578.     l    : CARDINAL;
  579. BEGIN
  580.   IF mtCommand.ArgV()
  581.   THEN
  582.     mtCommand.ParamString (0, p);
  583.   ELSE
  584.     (* Erstmal ShelRead aufrufen *)
  585.     MagicAES.ShelRead (p, applPath);
  586.   END;
  587.   FileNames.SplitPath (p, applPath, applName);
  588.   (* Jetzt testen, ob applName in Ordnung ist.
  589.    *)
  590.   IF MagicStrings.Pos (apName, applName, 0, FALSE) > 0
  591.   THEN
  592.     (* Stimmt wohl nicht! Dann stimmt gar nichts, Pfad und 
  593.      * Laufwerk rausfinden und dann mit ShelFind nach apName 
  594.      * mit verschiedenen Extensions suchen
  595.      *)
  596.     MagicStrings.Assign (apName, p);
  597.     MagicStrings.Append ('PRG', p);
  598.     MagicAES.ShelFind (p);
  599.     IF MagicAES.CallResult = 0
  600.     THEN
  601.       MagicStrings.Assign (apName, p);
  602.       MagicStrings.Append ('APP', p);
  603.       MagicAES.ShelFind (p);
  604.       IF MagicAES.CallResult = 0
  605.       THEN
  606.         (* Zweimal nicht gefunden. Jetzt sehen wir alt aus!
  607.          * Wir holen dann den applPath als aktuellen Pfad
  608.          *)
  609.         MagicAES.CallResult := 1;
  610.         MagicStrings.Assign ('', p);
  611.       END;
  612.     END;
  613.     IF MagicAES.CallResult # 0
  614.     THEN
  615.       FileNames.SplitPath (p, applPath, applName);
  616.       IF LENGTH (applPath) = 0
  617.       THEN
  618.         d := MagicDOS.Dgetdrv ();
  619.         MagicDOS.Dgetpath (applPath, d+1);
  620.         IF applPath[1] # ':'
  621.         THEN
  622.           IF applPath[0] # '\'
  623.           THEN
  624.             MagicStrings.Insert ('A:\', applPath, 0); 
  625.           ELSE
  626.             MagicStrings.Insert ('A:', applPath, 0); 
  627.           END;
  628.           applPath[0] := CHR(ORD('A') + d);
  629.         END;
  630.       END;
  631.     END;
  632.   END;
  633.   (* Jetzt testen wir den Pfad, ob der vollst„ndig ist *)
  634.   d := MagicDOS.Dgetdrv ();
  635.   MagicDOS.Dgetpath (p, d+1);
  636.   l := LENGTH (p);
  637.   IF (l = 0) OR ((l > 0) & (p[l-1] # '\'))
  638.   THEN
  639.     MagicStrings.Append ('\', p);
  640.   END;
  641.   IF applPath[0] = '\'
  642.   THEN
  643.     (* Laufwerksbezeichner fehlt *)
  644.     MagicStrings.Insert ('A:', applPath, 0); 
  645.     applPath[0] := CHR(ORD('A') + d);
  646.   ELSIF applPath[1] # ':'
  647.   THEN
  648.     (* Ist wohl ein relativer Pfad, also Laufwerk und Pfad einsetzen 
  649.      *)
  650.     MagicStrings.Insert (p, applPath, 0);
  651.     MagicStrings.Insert ('A:', applPath, 0);
  652.     applPath[0] := CHR(ORD('A') + d);
  653.   ELSIF applPath[2] # '\'
  654.   THEN
  655.     (* Relativer Pfad mit Laufwerksangabe *)
  656.     drv:= ORD (applPath[0]) - 65;
  657.     MagicDOS.Dsetdrv (drv, dummy);
  658.     MagicDOS.Dgetpath (p, 0);
  659.     MagicDOS.Dsetdrv (d, dummy);
  660.     l := LENGTH (p);
  661.     IF (l = 0) OR ((l > 0) & (p[l-1] # '\'))
  662.     THEN
  663.       MagicStrings.Append ('\', p);
  664.     END;
  665.     MagicStrings.Insert (p, applPath, 2);
  666.   END;
  667.   l := LENGTH (applPath);
  668.   IF (l > 2)  & (applPath [l-1] # '\')
  669.   THEN
  670.     MagicStrings.Append ('\', applPath);
  671.   END;
  672.   MagicStrings.Assign (applPath, path);
  673. END GetApplPath;
  674.  
  675. PROCEDURE ApplPath (VAR path: ARRAY OF CHAR);
  676. (* liefert den Pfad der Applikation 
  677.  *)
  678. BEGIN
  679.   MagicStrings.Assign (applPath, path);
  680. END ApplPath;
  681.  
  682. PROCEDURE ApplName (VAR name: ARRAY OF CHAR);
  683. (* liefert den Namen der Applikation 
  684.  *)
  685. BEGIN
  686.   MagicStrings.Assign (applName, name);
  687. END ApplName;
  688.  
  689. PROCEDURE Konjugiere (REF str1, single, plural: ARRAY OF CHAR; 
  690.                       count: CARDINAL; VAR out: ARRAY OF CHAR);
  691. (* konjugiert ein Wort nach Singular oder Plural
  692.  *)
  693. BEGIN
  694.   MagicStrings.Assign (str1, out);
  695.   IF count = 1
  696.   THEN
  697.     MagicStrings.Append (single, out);
  698.   ELSE
  699.     MagicStrings.Append (plural, out);
  700.   END;
  701. END Konjugiere;
  702.  
  703. PROCEDURE KurzName (REF name: ARRAY OF CHAR; VAR ziel: ARRAY OF CHAR; maxLen: CARDINAL);
  704.   VAR p, n   : INTEGER;
  705.       i      : CARDINAL;
  706.       tmpStr : CatTypes.String255;
  707. BEGIN
  708.   MagicStrings.Assign (name, tmpStr);
  709.   IF LENGTH (tmpStr) > maxLen
  710.   THEN
  711.     (* Erstmal Vornamen abkrzen *)
  712.     p := 0;
  713.     p := Strings.Pos (' ', tmpStr, 0);
  714.     IF p > 0
  715.     THEN
  716.       n := Strings.Pos ('@', tmpStr, 0);
  717.       IF (n-2 < p) & (n > 0)
  718.       THEN
  719.         (* Hinter dem @ abschneiden, da kein richtiger Vorname *)
  720.         tmpStr [n] := 0C;
  721.       ELSE
  722.         (* Vornamen verkrzen *)
  723.         Strings.Delete (tmpStr, 1, p-1, v.bool);
  724.         Strings.Insert ('.', 1, tmpStr, v.bool);
  725.       END;
  726.     END;
  727.   END;
  728.   IF LENGTH (tmpStr) > maxLen 
  729.   THEN 
  730.     (* Immer noch zu lang, hinten ... anh„ngen *)
  731.     FOR i := 1 TO 3 DO 
  732.       tmpStr[maxLen-i] := '.';
  733.     END;
  734.     tmpStr[maxLen] := 0C;
  735.   END;
  736.   MagicStrings.Assign (tmpStr, ziel);
  737. END KurzName;
  738.  
  739. TYPE    magAESVARS = RECORD
  740.                          magic      : LONGCARD; (* muž $87654321 sein         *)
  741.                          membot     : ADDRESS;  (* Ende der AES- Variablen    *)
  742.                          aes_start  : ADDRESS;  (* Startadresse               *)
  743.                          magic2     : LONGCARD; (* ist 'MAGX'                 *)
  744.                          date       : LONGCARD; (* Erstelldatum               *)
  745.                          chgres     : ADDRESS;  (* void ( *chgres)(int res, int txt);  /* Aufl”sung „ndern      *)
  746.                          shel_vector: ADDRESS;  (* long ( **shel_vector)(void);   /* residentes Desktop         *)
  747.                          aes_bootdrv: ADDRESS;  (* char *aes_bootdrv;            /* von hieraus wurde gebootet *)
  748.                          vdi_device : ADDRESS;  (* int  *vdi_device;             /* vom AES benutzter Treiber  *)
  749.                          (* zus„tzliche Variablen, die nicht dokumentiert sind       *)
  750.                          nvdi_work  : ADDRESS;  (* void **nvdi_workstation;      /* vom AES benutzte Workstation *)
  751.                          shelw_doex : ADDRESS;  (* int  *shelw_doex;             /* shel-write variable        *)
  752.                          shelw_isgr : ADDRESS;  (* int  *shelw_isgr;             /* shel-write variable        *)
  753.                          version    : INTEGER;  (* int  version;                 /* in Hex 0111 (BCD)          *)
  754.                          release    : INTEGER;  (* int  release;                 /* +224 = Zeichen der Version *)
  755.                          _basepage  : LONGCARD;
  756.                          moff_cnt   : ADDRESS;  (* int  *moff_cnt; *)
  757.                          shel_buf_len: LONGCARD; (* long shel_buf_len; *)
  758.                          shel_buf   : ADDRESS;  (* long shel_buf; *)
  759.                          ntrdy_list : LONGCARD; (* long notready_list; *)
  760.                          menu_up    : LONGCARD; (* long menu_up; *)
  761.                          menutree   : LONGCARD; (* long menutree; *)
  762.                          desktree   : LONGCARD; (* long desktree; *)
  763.                          desk_1stob : LONGCARD; (* long desktree_1stob; *)
  764.                          dos_magic  : LONGCARD; (* long dos_magic; *)
  765.                          max_windn  : LONGCARD; (* long maxwindn; *)
  766.                          fsel       : ADDRESS;  (* int  ( **fsel) (char* path, char* name, int* button, char* title); *)
  767.                          dummy      : LONGCARD; (* long dummy; *)
  768.                      END;
  769.     AESVARPTR   = POINTER TO magAESVARS;
  770.     
  771.     magXCookiePtr = POINTER TO RECORD
  772.                                  config_status : LONGCARD;  (* long    config_status; *)
  773.                                  dosvars       : ADDRESS;   (* DOSVARS *dosvars; *)
  774.                                  aesvars       : AESVARPTR; (* AESVARS *aesvars; *)
  775.                                END;
  776.  
  777. VAR magX_ptr : magXCookiePtr;
  778.     mg3dMode : INTEGER;
  779.  
  780. BEGIN (* Init-Teil vom Modul *)
  781.   SaveName := '';
  782.   OpenName := '';
  783.   prgName  := '';
  784.   mouseIndex := 0;
  785.   mouseArray[0]:= ADDRESS (mouseData1);
  786.   mouseArray[1]:= ADDRESS (mouseData2);
  787.   mouseArray[2]:= ADDRESS (mouseData3);
  788.   mouseArray[3]:= ADDRESS (mouseData4);
  789.   mouseArray[4]:= mouseArray[0];
  790.   bongArray[1] := ADDRESS (Bong1);
  791.   bongArray[2] := ADDRESS (Bong2);
  792.   bongArray[3] := ADDRESS (Bong3);
  793.   bongArray[4] := ADDRESS (Bong4);
  794.   bongArray[5] := ADDRESS (Bong5);
  795.   bongArray[6] := ADDRESS (Bong6);
  796.   bongArray[7] := ADDRESS (Bong7);
  797.   (* Jetzt noch die TOS-Versionsvariablen initialisieren *)
  798.  
  799.   (* Mindestens TOS 1.4 vorhanden? *)
  800.   minTos14 := MagicAES.AESGlobal.apVersion >= 0140H;
  801.   (* allgemein MultiTasking m”glich? *)
  802.   multiTask := MagicAES.AESGlobal.apCount # 1;
  803.   (* Cookie abfragen, ob Mag!X *)
  804.   magIx := MagicCookie.FindCookie (MagiXCookie, magX_ptr);
  805.   IF magIx & (magX_ptr^.aesvars # NIL)
  806.   THEN
  807.     magIxVer := magX_ptr^.aesvars^.version;
  808.  
  809.     magIxDate := ( (magX_ptr^.aesvars^.date MOD 65536L) * 65536L) + 
  810.                  (((magX_ptr^.aesvars^.date DIV 65536L) MOD 256L) * 256L) + 
  811.                  (magX_ptr^.aesvars^.date DIV (65536L*256L)) ;
  812.     CALLSYS (1, 4201, CADR ("magIxDate: %lx, mgxDate: %lx"), magIxDate, magX_ptr^.aesvars^.date);
  813.   END;
  814.     
  815.   (* Eventuell sogar MultiTOS? *)
  816.   IF (MagicAES.AESGlobal.apVersion >= 0400H) & multiTask & ~magIx
  817.   THEN
  818.     (* MultiTOS *)
  819.     multiTOS := TRUE;
  820.   END;
  821.   (* Und jetzt noch abfragen, ob es vielleicht doch MultiGEM ist *)
  822.   multiGEM := ~multiTOS & ~magIx & 
  823.               MagicCookie.FindCookie (MultiGEMCookie, v.lcard);
  824.   tos3DLook := multiTOS;
  825.   IF ~multiTOS & magIx
  826.   THEN
  827.     IF magIxVer > $200
  828.     THEN
  829.       (* ObjcSysvar, ob 3D-Look unter MagIx eingeschaltet ist *)
  830.       v.int := MagicAES.ObjcSysvar (0, 10, 0, 0, mg3dMode, v.int);
  831.       IF v.int > 0
  832.       THEN
  833.         tos3DLook := mg3dMode # 0;
  834.       END;
  835.     END;
  836.   END;
  837.   magicMac := magIx & MagicCookie.FindCookie (MagicMacCookie, v.lcard);
  838.   update := FALSE;
  839. END CatGlobal.
  840.